1. Field of the Invention
The present invention is related to a technique for optimizing a program, more particularly such as a COBOL program, that includes packed decimal variables.
2. Description of the Related Art
COBOL is a computer programming language developed in 1959 primarily for business use. It is still used today in mainframe computer systems and the like, partly to inherit past programming resources. One mainframe in computer systems is the System z, available by International Business Machines Corporation (registered trademark).
In COBOL, calculations of the type are internally performed in packed decimal, unless the types of calculations used are all designated explicitly as the binary type.
In a calculation that uses packed decimal, a sign can not be assigned correctly. For example, when the following calculations are made for four-digit variables, the resulting signs are incorrect.−9999−1=>−0−1/10=>−05000*2=>−0
The above values should be +0. When −0 is displayed as it is, it will give a strange feeling to the operator. Therefore, an instruction for correctly assigning a sign (positive or negative) is generated. Such an instruction will be referred to as a “ZAP”.
A specific example of assembler code is as follows. For the expression “compute idx=idx−1” in COBOL, in which the variable idx is defined as “01 idx pic s9(4)”, the following code is generated.
1. PACK 272(3,13),24(4,8) tmp=PACK(idx)
2. SP 272(3,13),52(1,10) tmp=tmp−1
3. NI 272(13),X ‘0F’ Set the fifth digit to 0
4. ZAP 272(3,13),272(3,13) tmp=ZAP(tmp)
5. UNPK 24(4,8),272(3,13) idx=UNPK(tmp)
Assuming that the initial value of idx is −9999, the result of the calculation in 2 above is −10000. The variable idx is a four-digit number, −10000 is rounded in 3 above to −0000. The sign of this value is incorrect. Thus, with the ZAP instruction in 4 above, −0000 is changed to +0000.
The ZAP is very costly, leading to a decrease in speed. There is a demand for improving this problem. The following conventional techniques can be applicable to the optimization of COBOL and other programs.
A technique is described in Japanese Unexamined Patent Publication No. 2008-102740 as follows. In a language processing system which is executed by a processor in a computer system, in branch processing, as to a branch in which two references are first compared to determine whether they are identical. If the result is true, then a branch is made, otherwise a method for verifying equivalence of instances directed by the individual references is called, and a branch is made if the return value is true. This branch, according to the comparison between the references and its result, is removed on the condition that the probability of the result of the comparison between the references being true is sufficiently small and that the removal of the branch according to the comparison between the references and its result will hardly change the result of execution of the program.
A technique is described in Japanese Unexamined Patent Publication No. 2009-134523 as follows. In an assembler device 1 for converting an assembler source program to a machine language program executable by a processor 5, an extended macro instruction (XId instruction and Xjnz instruction) included in the assembler source program is expanded to a basic instruction (Id instruction and jnz instruction) and an extended instruction (ext instruction). Thereafter, the expanded ext instruction is optimized by determining the numerical data of the operand and omitting a redundant instruction. If this optimization of the ext instruction has caused a change of the address of the label, the ext instruction is optimized again.
As described in Japanese Unexamined Patent Publication No. 2005-107816 an optimization compiler optimizes a load instruction for reading data from a memory in a target program to be optimized. The optimization compiler includes: partial redundancy removal means for performing, on load instructions for reading data from the memory to variables, a process of removing partial redundancy which does not cause spill processing when the variables are allocated to a register; reverse direction register detection means for detecting a free register, which is not allocated to any variable, in an execution route arriving at the load instructions by tracking the execution sequence reversely from the instructions that use the data read by the load instructions; and free register allocating means for allocating the free register detected by the reverse direction register detection means to the read destination variables onto which the load instructions read data.
As described in Japanese Unexamined Patent Publication No. 2000-81983 in order to eliminate redundant array range check, the following units are provided: a unit for eliminating redundant array range check by versioning for loop; a unit for optimizing the array range check by performing data flow analysis in the reverse order of execution; and a unit for collecting information about the array range checks already processed, by performing data flow analysis in the order of execution, and eliminating the redundant array range check on the basis of the collected information.
None of the above-described conventional techniques discloses nor suggests a technique for optimizing the use of a sign assignment instruction, like a ZAP, for correctly assigning a packed decimal sign.